#ifndef CONTROLADORCLIENTE_H_
#define CONTROLADORCLIENTE_H_

#include "../../Modelo/ClaseModelo/Modelo.h"
#include "../../Controlador/InputServidor.h"
#include "../../Utils/Timer.h"
#include "../../Utils/Logger.h"
#include "../Socket.h"
#include <netinet/tcp.h>
#include <arpa/inet.h>

#include "ControladorEscrituraCliente.h"
#include "ControladorLecturaCliente.h"

#include <algorithm>
#include <sys/ioctl.h>

#define TIEMPO_ENTRE_MENSAJES_SERVER 3000
#define SERVER_TIMEOUT 20000
#define DELAY_CABEZA_SERVER 15

using namespace std;

enum EstadoJuego {
	JuegoNoComenzo,
	EsperandoJugadores,
	Jugando,
	FinForzado,
	FinJuego,
	ProximoJuego
};

class ControladorCliente {
	
	int socket;
	
	ControladorEscrituraCliente* escritura;
	ControladorLecturaCliente* lectura;
	
	EstadoJuego estadoJuego;
	pthread_mutex_t mutexEstadoJuego;
	EstadoConexion estadoConexion;
	pthread_mutex_t mutexEstadoConexion;
		
	public:
	
		std::ofstream log_controladorCliente;
	
		ControladorCliente(int cliente, int tipoPersonaje, int pisoNivel, int anchoNivel, int altoNivel, int gravedad,EstadoJuego estado);
		virtual ~ControladorCliente();
		
		void ManejarCliente();
		
		void setEstadoConexion(EstadoConexion estado);
		void setEstadoJuego(EstadoJuego estado);
		EstadoConexion getEstadoConexion();
		EstadoJuego getEstadoJuego();
		
		ControladorLecturaCliente* getControladorLectura();
		ControladorEscrituraCliente* getControladorEscritura();
				
		int getSocket();
		void CongelarPosicionJugador();
		
		void EnviarMensaje(string mensaje, string tipo);
};

void* ServidorEnvia(void* data);
void* ServidorRecibe(void* data);

#endif /* CONTROLADORCLIENTE_H_ */
